package com.probiz.estore.catalog.service;

import com.probiz.estore.core.service.GenericManager;
import com.probiz.estore.catalog.model.BaseCategory;
import com.probiz.estore.catalog.model.BaseCategorySearchCriteria;

import java.util.List;

import net.sf.json.JSONArray;

/**
 * Created by Probiz
 * User: hoverming
 * Date: 2009-12-2
 * Time: 11:16:27
 */
public interface BaseCategoryManager <T> extends GenericManager<T> {
	/**
	 * 根据目录id获得Category对象
	 * @param categoryId 目录主键
	 * @return category对象
	 */
	public BaseCategory getCategoryById(Integer categoryId);

	/**
	 * 获得目录树
	 * 用法：例如getCategoryTree(getCategoryById(2),3),那么将会获得一棵根节点为T(id=2)，包含3代儿子的树(自己不算一层深度);
	 * 再如getCategory(null,4),那么将会获得一棵根节点T(id=1),包含4代儿子的树。 另外如果depth<=0那么将只包含根节点
	 *
	 * @param parentCategory
	 *            父目录   目录树的起始节点
	 * @param depth
	 *            取树的深度(不超过) 注意：这个深度是相对深度。
	 * @return Category 返回树的根节点
	 */
	public BaseCategory getCategoryTree(BaseCategory parentCategory, int depth);
	/**
	 * 获得目录树
	 * 用法：例如getCategoryTree(getCategoryById(2),3),那么将会获得一棵根节点为T(id=2)，包含3代儿子的树(自己不算一层深度);
	 * 再如getCategory(null,4),那么将会获得一棵根节点T(id=1),包含4代儿子的树。 另外如果depth<=0那么将只包含根节点
	 *
	 * @param parentCategory
	 *            父目录  目录树的起始节点
	 * @param depth
	 *            取树的深度(不超过) 注意：这个深度是相对深度。
	 * @param categorySearchCriteria 搜索条件
	 * @return Category 返回树的根节点
	 */
	public BaseCategory getCategoryTree(BaseCategory parentCategory, int depth, BaseCategorySearchCriteria categorySearchCriteria);


	/**
	 * 获得目录列表
	 *
	 * @param parentCategory
	 *            起始节点
	 * @param depth
	 *            深度
	 * @return List<Category>目录列表
	 */
	public List<BaseCategory> getCategoryList(BaseCategory parentCategory, int depth);
	/**
	 * 获得目录列表
	 *
	 * @param parentCategory
	 *            起始节点
	 * @param depth
	 *            深度
	 * @param categorySearchCriteria 目录搜索条件
	 * @return List<Category>目录列表
	 */
	public List<BaseCategory> getCategoryList(BaseCategory parentCategory, int depth,BaseCategorySearchCriteria categorySearchCriteria);
	/**
	 * 获得目录列表
	 *
	 * @param parentCategoryId  起始节点
	 * @param depth 深度
	 * @return List<Category>目录列表
	 */
	public List<BaseCategory> getCategoryListById(Integer parentCategoryId, int depth);
	/**
	 * 获得目录列表
	 *
	 * @param parentCategoryId
	 *            起始节点id
	 * @param depth
	 *            深度
	 * @param categorySearchCriteria 目录搜索条件
	 * @return List<Category>目录列表
	 */
	public List<BaseCategory> getCategoryListById(Integer parentCategoryId, int depth,BaseCategorySearchCriteria categorySearchCriteria);

	/**
	 * 获得目录列表JSON对象
	 * @param parentCategory  起始目录
	 * @param depth   深度
	 * @return 目录列表JSONArray,array中包含了JSONObject，
	 * 每个object为{categoryId,categoryCode,categoryName,depth,hasChildren,parentId,categoryPath...}
	 */
	public JSONArray getCategoryListJSON(BaseCategory parentCategory, int depth);
	/**
	 * 获得目录列表JSON对象
	 * @param parentCategory
	 *            起始节点
	 * @param depth
	 *            深度
	 * @param categorySearchCriteria 目录搜索条件
	 * @return 目录列表JSONArray,array中包含了JSONObject，
	 * 每个object为{categoryId,categoryCode,categoryName,depth,hasChildren,parentId,categoryPath...}
	 *
	 * 注意：实际上从面向对象的角度来说 应该用getCategoryTreeJSON即获得目录树对象JSON方法来取代，用该方法取代是为了使得程序更简单可读。
	 */
	public JSONArray getCategoryListJSON(BaseCategory parentCategory, int depth,BaseCategorySearchCriteria categorySearchCriteria);

	/**
	 * 更新目录列表的排序值，越靠前值越小
	 * @param categoryIds 要更新的目录id集合
	 */
	public void updateCategoriesSortOrder(Integer[] categoryIds) ;
	/**
	 * 统计指定目录下的直接子目录数
	 * @param categoryId 目录id
	 * @return 直接子目录数目
	 */
	public Integer countSubCategoryById(Integer categoryId);
	/**
	 * 根据categoryPath获得categoryId
	 * @param categoryPath
	 * @return
	 */
	public Integer getCategoryIdByCategoryPath(String categoryPath);
	/**
	 * 获得平台目录总数
	 * @return
	 */
	public Long countCategoryTotal();
}
